﻿using B.S.InOut.Domain;
using B.S.InOut.Read.API.Application.Command;
using B.S.InOutErrorCode;
using MediatR;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using static B.S.InOut.Read.API.Application.Command.DeleteOutManageCommand;
using static B.S.InOut.Read.API.Application.Command.GetProductsByConditionsCommand;
using static B.S.InOut.Read.API.Application.Command.GetProductsByConditionsCommand.DeleteProductsCommand;

namespace B.S.InOut.Read.API.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class PeoductController : ControllerBase
    {
        // 中介者实例
        private readonly IMediator _mediator;

        // 构造函数，注入中介者实例
        public PeoductController(IMediator mediator)
        {
            _mediator = mediator;
        }

        // HTTP POST 请求，用于插入产品
        [HttpPost]
        public async Task<IActionResult> InsertProduct([FromBody] ProductModel product)
        {
            // 创建插入产品命令
            var command = new InsertProductCommand(product);
            // 发送命令给中介者并获取插入记录的 ID
            var id = await _mediator.Send(command);
            // 返回插入记录的 ID
            return Ok(id);
        }

        // HTTP GET 请求，根据 ID 获取产品
        [HttpGet("{id}")]
        public async Task<IActionResult> GetProductById(int id)
        {
            // 创建获取产品命令
            var command = new GetProductByIdCommand(id);
            // 发送命令给中介者并获取产品对象
            var product = await _mediator.Send(command);
            if (product == null)
            {
                // 如果产品不存在，返回 404 状态码
                return NotFound();
            }
            // 返回产品信息
            return Ok(product);
        }

        // HTTP GET 请求，获取所有产品
        [HttpGet]
        public async Task<IActionResult> GetAllProducts()
        {
            // 创建获取所有产品命令
            var command = new GetAllProductsCommand();
            // 发送命令给中介者并获取产品集合
            var products = await _mediator.Send(command);
            // 返回所有产品信息
            return Ok(products);
        }

        // HTTP PUT 请求，更新产品信息
        [HttpPost]
        public async Task<IActionResult> UpdateProduct([FromBody] ProductModel product)
        {
            // 创建更新产品命令
            var command = new UpdateProductCommand(product);
            // 发送命令给中介者并获取受影响的行数
            var rowsAffected = await _mediator.Send(command);
            if (rowsAffected == 0)
            {
                // 如果没有记录受影响，返回 404 状态码
                return NotFound();
            }
            // 返回更新成功信息
            return Ok("更新成功");
        }


        // HTTP DELETE 请求，根据 ID 删除产品
        [HttpPost]
        public async Task<IActionResult> DeleteProduct(int id)
        {
            // 创建删除产品命令
            var command = new DeleteProductCommand(id);
            // 发送命令给中介者并获取受影响的行数
            var rowsAffected = await _mediator.Send(command);
            if (rowsAffected == 0)
            {
                // 如果没有记录受影响，返回 404 状态码
                return NotFound();
            }
            // 返回删除成功信息
            return Ok("删除成功");
        }

        /// <summary>
        /// 多条件分页查询产品的 HTTP GET 方法
        /// </summary>
        /// <param name="name">产品名称（可空，作为查询条件）</param>
        /// <param name="minPrice">最低价格（可空，作为查询条件）</param>
        /// <param name="maxPrice">最高价格（可空，作为查询条件）</param>
        /// <param name="pageNumber">页码</param>
        /// <param name="pageSize">每页显示的记录数</param>
        /// <returns>分页后的产品列表</returns>
        [HttpGet("paginated")]
        public async Task<IActionResult> GetProductsByConditions([FromQuery] string? ProductNum, [FromQuery] string? ProductName, [FromQuery] string? Category, [FromQuery] int pageindex = 1, [FromQuery] int pageSize = 10)
        {
            Apipaging<ProductModel> result = new Apipaging<ProductModel>();

            var command = new GetProductsByConditionsCommand(ProductNum, ProductName, Category, pageindex, pageSize);
            var products = await _mediator.Send(command);
            result.totalcount = products.Count();
            result.totalpage = (int)Math.Ceiling(result.totalcount * 1.0 / pageSize);
            result.List = products.OrderByDescending(p => p.ProductId).Skip((pageindex - 1) * pageSize).Take(pageSize).ToList();
            return Ok(new { result });
        }
        /// <summary>
        /// 批量删除产品的 HTTP DELETE 方法
        /// </summary>
        /// <param name="productIds">要删除的产品 ID 列表</param>
        /// <returns>操作结果</returns>
        [HttpPost]
        public async Task<IActionResult> DeleteProducts([FromQuery] IEnumerable<int> productIds)
        {
            var command = new DeleteProductsCommand(productIds);
            var rowsAffected = await _mediator.Send(command);

            if (rowsAffected > 0)
            {
                return Ok("Products deleted successfully");
            }
            else
            {
                return NotFound("No products were found with the provided IDs");
            }
        }
        /// <summary>
        /// 处理批量查询产品数据的 HTTP GET 请求
        /// </summary>
        /// <param name="productIds">产品 ID 列表，以逗号分隔</param>
        /// <returns>产品数据的列表</returns>
        //[HttpGet("product-ids")]
        //public async Task<IActionResult> GetProductModelsByIds([FromQuery] List<int> productIds)
        //{
        //    var command = new GetProductModelsByIdsCommand(productIds);
        //    var result = await _mediator.Send(command);
        //    return Ok(result);
        //}


        ///// <summary>
        ///// 调用批量查询接口获取产品数据并导出为 Excel 文件
        ///// </summary>
        ///// <param name="productIds">产品 ID 列表，以逗号分隔</param>
        ///// <returns>Excel 文件作为下载内容</returns>
        //[HttpGet("export-product-by-ids")]
        //public async Task<IActionResult> ExportProductDataByIdsToExcel([FromQuery] List<int> productIds)
        //{
        //    if (productIds == null || !productIds.Any())
        //    {
        //        return BadRequest("请选择产品 ID 列表。");
        //    }
        //    // 调用中介者模式获取批量产品数据
        //    var command = new GetProductModelsByIdsCommand(productIds);
        //    var productData = await _mediator.Send(command);
        //    if (productData?.Any() != true)
        //        return NotFound("未找到产品数据。");

        //    using IWorkbook book = new XSSFWorkbook();
        //    ISheet sheet = book.CreateSheet("产品列表");
        //    IRow headerRow = sheet.CreateRow(0);
           
        //        string[] headers = {
        //            "产品Id", "产品编码", "产品名称", "厂家编码",
        //            "内部编码", "产品单位", "产品类别", "产品上限值",
        //            "产品下限值", "产品规格", "产品价格", "产品默认仓库",
        //            "默认库位", "供应商", "客户","产品描述"
        //        };

        //        // 填充表头数据
        //        for (int i = 0; i < headers.Length; i++)
        //        {
        //            headerRow.CreateCell(i).SetCellValue(headers[i]);
        //        }

        //        // 填充数据行
        //        int rowIndex = 1;
        //        foreach (var item in productData)
        //        {
        //            IRow dataRow = sheet.CreateRow(rowIndex++);
        //            dataRow.CreateCell(0).SetCellValue(item.ProductId);
        //            dataRow.CreateCell(1).SetCellValue(item.ProductNum);
        //            dataRow.CreateCell(2).SetCellValue(item.ProductName);
        //            dataRow.CreateCell(3).SetCellValue(item.ManufacturerCode);
        //            dataRow.CreateCell(4).SetCellValue(item.InternalCode);
        //            dataRow.CreateCell(5).SetCellValue(item.UnitId);
        //            dataRow.CreateCell(6).SetCellValue(item.CategoryId);
        //            dataRow.CreateCell(7).SetCellValue(item.UpperLimit);
        //            dataRow.CreateCell(8).SetCellValue(item.LowerLimit);
        //            dataRow.CreateCell(9).SetCellValue(item.Specification);
        //            dataRow.CreateCell(10).SetCellValue((double)item.Price);
        //            dataRow.CreateCell(11).SetCellValue(item.WHouseId);
        //            dataRow.CreateCell(12).SetCellValue(item.WHouseTypeId);
        //            dataRow.CreateCell(13).SetCellValue(item.Supplie);
        //            dataRow.CreateCell(14).SetCellValue(item.Customer);
        //            dataRow.CreateCell(16).SetCellValue(item.Description);
        //        }

        //        //// 自动调整列宽以适应内容
        //        //for (int i = 0; i < headers.Length; i++)
        //        //{
        //        //    sheet.AutoSizeColumn(i);
        //        //}

        //        // 创建内存流用于存储 Excel 文件内容
        //        using var ms = new MemoryStream();
        //        book.Write(ms);
        //        byte[] buffer = ms.ToArray();

        //        // 返回文件结果，供客户端下载
        //        return File(buffer, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "产品列表.xlsx");
           
        //}
    }
}

